home *** CD-ROM | disk | FTP | other *** search
/ Oh!X 2000 Spring / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z / Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin / F2JW / trans / prep.cpp < prev    next >
C/C++ Source or Header  |  1999-08-22  |  15KB  |  568 lines

  1. //
  2. // フランス語 → 日本語 翻訳プログラム
  3. //
  4. // 前置詞の処理
  5.  
  6. #include "stdafx.h"
  7. #include    <string.h>
  8. #include    <ctype.h>
  9.  
  10. #include    "f2j.h"
  11. #include    "score.h"
  12. #include    "myprot.h"
  13.  
  14. //
  15. // 前置詞 + 前置詞 -> 前置詞
  16. // eg) comme si, tandis que, ...
  17. //
  18. void
  19. CombinePrepositions( TOKEN *start)
  20. {
  21.     TOKEN *p;
  22.  
  23.     for(p = start; p; p = p->next) {
  24.     }
  25. }
  26.  
  27. //   -- CombinePrepositionNoun --
  28. //   連結を行わない例外
  29. //
  30. CMP_TOKEN    pat_PrepNounRel[] = {
  31.     CMP_TOKEN( FR_PART_NOUN_ALL,            JP_PROP_NONE,    NULL),
  32.     CMP_TOKEN( FR_PART_RELATIVE_ALL,        JP_PROP_NONE,    NULL),
  33.     CMP_TOKEN( FR_PART_NONE)
  34. };
  35.  
  36. //   -- CombinePrepositionObject --
  37. //   前置詞 + 名詞 → 前置詞句
  38. //   例) dans une voiture
  39. //
  40. void
  41. CombinePrepositionObject(TOKEN *start)
  42. {
  43.     TOKEN    *p = start;
  44.     TOKEN    *lastPrep = NULL, *lastObj = NULL;
  45.  
  46.     // 文末の前置詞は無視する
  47.     for(p = start; p; p = p->next) {
  48.         TOKEN *next = p->next;
  49.         if( (p->frPart & FR_PART_PREPOSIT)
  50.         && !(p->frPart & FR_PART_COMBINE)
  51.         &&  p->object1 == NULL
  52.         &&  next
  53.         && (next->frPartParent & FR_PART_PREPOSIT)
  54.         &&  MatchPrepositionObject(p, next)) {
  55.             if(!IsPatternMatch(pat_PrepNounRel, next)) {
  56.                 lastPrep = p;
  57.                 lastObj = p->next;
  58.             }
  59.         } else if(ToWaitCombinePrepositionObject(p, lastPrep, lastObj)) {
  60.             lastPrep = lastObj = NULL;
  61.         }
  62.     }
  63.  
  64.     if(lastPrep) {
  65.         CombinePrepositionObject(start, lastPrep, lastObj);
  66.     }
  67. }
  68.  
  69. //
  70. // Combine Preposition Objectを待つべきか?
  71. //
  72. BOOL
  73. ToWaitCombinePrepositionObject(TOKEN *p, TOKEN *prep, TOKEN *obj)
  74. {
  75.     if((p->frPart & FR_PART_SPECIAL)
  76.     && p->frPart != FR_PART_SPECIAL_COMMA) {
  77.         // 目的語の名詞の後ろに関係代名詞が続いているかもしれない。
  78.         // Nous courons vers la baraque qui se trouvait dans la bois.
  79.         return(TRUE);
  80.     }
  81.     if( obj
  82.     &&  p != obj
  83.     // S+V si S+V <, mais> S+V はOK
  84.     && ((p->frPart & FR_PART_COMBINE) && (p->punctuation != FR_PUNCT_COMMA))
  85.     && !(p->frPart & FR_PART_PREPOSIT)
  86.     && p->object1 == NULL
  87.     && ((p->frPart & FR_PART_ALL) & obj->frPart)
  88.     && ((p->frPart & ~FR_PART_ALL) & obj->frPart)) {
  89.         // Avec du beuere ou de la confiture.    バターかジャムを付けて
  90.         return(TRUE);
  91.     }
  92.     if(p->frPart & FR_PART_VERB) {
  93.         // すでに、前置詞の目的語となっている
  94.         if(obj == p)    return(FALSE);
  95.         // De une main <tremblante>など
  96.         if(p->frTense == FR_TENSE_PASSIVE
  97.         || p->frTense == FR_TENSE_P_PAST
  98.         || p->frTense == FR_TENSE_P_PRESENT)
  99.             return(TRUE);
  100.     }
  101.     if(obj
  102.     && obj->next
  103.     && (obj->next->frPart & FR_PART_PREPOSIT)
  104.     && (obj->next->frPartParent & obj->frPart)
  105.     && MatchParentPreposition(obj, obj->next))
  106.         return(TRUE);
  107.  
  108.     if((p->frPart & FR_PART_PREPOSIT)
  109.     && !(p->frPart & FR_PART_COMBINE)
  110.     && p->object1 == NULL)
  111.         return(TRUE);
  112.  
  113.     return(FALSE);
  114. }
  115.  
  116. JP_ADVERB    dic_jpEnRetard("遅れ",    JP_KIND_TA, JP_PROP_TIME, JP_PROP_ALL);
  117. ADVERB    dic_EnRetard  = { "EN_RETARD",    JPADVERB_DIC(&dic_jpEnRetard)    };
  118.  
  119.  
  120. void
  121. CombinePrepositionObject(TOKEN *start, TOKEN *prep, TOKEN *obj)
  122. {
  123.     TOKEN    *q;
  124.  
  125.     if((obj->frPartParent & FR_PART_VERB)
  126.     &&  obj->next
  127.     &&  obj->next->subject == NULL
  128.     && (obj->next->frPart & FR_PART_VERB)) {
  129.         // <Comme je> vous le dis -> Comme <je vous le dis>
  130.         TOKEN *altP = CopyCurrentTree(obj, "CombinePrepositionObject");
  131.         altP->frPartParent = FR_PART_VERB;
  132.     }
  133.  
  134.     for(q = start; q; q = q->next)
  135.         if(q == obj) break;
  136.  
  137.     if(q)    DisconnectTOKEN(start, obj);
  138.  
  139.     if(IsObjectMatch(obj, FR_PART_NOUN_GENERAL, JP_PROP_NONE, NULL, "retard")) {
  140.         ChangeToAdverb(prep, &dic_EnRetard);
  141.     } else {
  142.         prep->object1 = obj;
  143.         SelectJpPreposition1(prep, obj);
  144.         // seulement aux gens. その少年達<だけ>に
  145.         obj->jpEmphasis |= prep->jpEmphasis;
  146.  
  147.         // jusqu'<au> moment de parvenir.
  148.         if((obj->frPart & FR_PART_PREPOSIT)
  149.         || IsObjectMatch(obj, FR_PART_SENTENCE_QUE))
  150.             SetPrtControlReplace(obj);
  151.     }
  152.  
  153.     if(IsObjectMatch(obj, FR_PART_VERB_INF)) {
  154.         // 動詞を目的語としてとる前置詞は、frPartを特別に代える
  155.         if(prep->frPart == FR_PART_PREPOSIT_A)        prep->frPart = FR_PART_PREPOSIT_A_INF;
  156.         if(prep->frPart == FR_PART_PREPOSIT_DE)        prep->frPart = FR_PART_PREPOSIT_DE_INF;
  157.         if(prep->frPart == FR_PART_PREPOSIT_POUR)    prep->frPart = FR_PART_PREPOSIT_POUR_INF;
  158.     }
  159. }
  160.  
  161. //   -- CombineParentPreposition1 --
  162. //   名詞 + 前置詞句 → 名詞句
  163. // Parentの辞書をたよりに連結する
  164. //    (主に熟語)
  165. //
  166. void
  167. CombineParentPreposition1(TOKEN *start)
  168. {
  169.     TOKEN    *p;
  170.     TOKEN    *noun = NULL, *adjective = NULL;
  171.  
  172.     // 文末の前置詞は無視する
  173.     for(p = start; p; p = p->next) {
  174.         TOKEN    *next = p->next;
  175.  
  176.         if(!(p->frPart & FR_PART_COMBINE)
  177.         &&  next
  178.         &&  next->frPartChoice != FR_PART_OBJECT
  179.         && ( IsObjectMatch(next, FR_PART_PREPOSIT_ALL)
  180.           || IsObjectMatch(next, FR_PART_SENTENCE_QUE))) {
  181.             if(MatchNounObject(p, next)) {
  182.                 noun = p;        adjective = NULL;
  183.                 p = next;
  184.             } else if(MatchAdjectiveObject(p, next)) {
  185.                 noun = NULL;    adjective = p;
  186.                 p = next;
  187.             }
  188.         }
  189.         if((noun || adjective)
  190.         && ToWaitCombineParentPreposition1(start, p)) {
  191.             noun = adjective = NULL;
  192.         }
  193.     }
  194.  
  195.     if(noun) {
  196.         CombineNounObject(start, noun, noun->next);
  197.     } else if(adjective) {
  198.         CombineAdjectiveObject(start, adjective, adjective->next);
  199.     }
  200. }
  201.  
  202. BOOL
  203. ToWaitCombineParentPreposition1(TOKEN *start, TOKEN *p)
  204. {
  205.     // favorable (@ la libert{<,> aux arts et aux lettres).
  206.     if(p->frPart == FR_PART_SPECIAL
  207.     && (p->frPartChoice & FR_PART_COMBINE)
  208.     && (p->frPartChoice & FR_PART_PREPOSIT))
  209.         return(TRUE);
  210.  
  211.     if((p->frPart & FR_PART_COMBINE)
  212.     && (p->frPart & FR_PART_PREPOSIT)
  213.     && (p->object1 == NULL || p->object2 == NULL))
  214.         return(TRUE);
  215.  
  216.     if((p->frPart & FR_PART_SPECIAL)
  217.     && p->frPart != FR_PART_SPECIAL_COMMA)
  218.         return(TRUE);
  219.  
  220.     if(IsObjectMatch(p, FR_PART_VERB_UNCLEAR)
  221.     && !(p->frPart & FR_PART_COMBINE))
  222.         return(TRUE);
  223.  
  224.     return(FALSE);
  225. }
  226.  
  227.  
  228. //
  229. // -- CombineVerbPreposition --
  230. // 動詞 + 前置詞句 → 動詞句
  231. // 動詞辞書内の前置訳を優先するので、whichが決定した動詞のみ扱う
  232. //
  233. // S + V1 + V2 + prep -> S + (V1 + (V2 + prep))
  234. // とするため、CombineVerbObjectより前に実行する
  235. //
  236. void
  237. CombineVerbPreposition(TOKEN *start)
  238. {
  239.     TOKEN    *p;
  240.     TOKEN    *lastParent = NULL, *lastPreposition = NULL;
  241.  
  242.     for(p = start; p; p = p->next) {
  243.         if((p->frPart & FR_PART_VERB)
  244.         // 動詞訳に前置詞が含まれているかもしれない
  245.         && p->which
  246.         // 間に関係代名詞は入れない
  247.         && SearchToken(FR_PART_RELATIVE_ALL, p->child) == NULL
  248. //        && HasVerbVerbObject(p) == FALSE
  249.         && p->next
  250.         && (p->next->frPart & FR_PART_PREPOSIT)
  251.         &&  p->next->frPartChoice != FR_PART_OBJECT
  252.         &&  p->next->object1
  253.         && (p->frPart & p->next->frPartParent)
  254.         && MatchParentPreposition(p, p->next)) {
  255.             lastParent = p; lastPreposition = p->next;
  256.         }
  257.     }
  258.  
  259.     if(lastParent
  260.     && lastPreposition) {
  261.         CombineParentPreposition(start, lastParent, lastPreposition);
  262.     }
  263. }
  264.  
  265.  
  266. //    Il se  coupe  par megarde le petit doigt.
  267. // -> Il coupe <se> par megarde le petit dogit.
  268. // coupeとparを注目できるように
  269. CMP_TOKEN    pat_VerbRecursivePreposition[] = {
  270.     CMP_TOKEN( FR_PART_VERB_UNCLEAR,        JP_PROP_NONE,    NULL),
  271.     CMP_TOKEN( FR_PART_NOUN_OBJECT_BOTH,    JP_PROP_NONE,    IsMoved),
  272.     CMP_TOKEN( FR_PART_PREPOSIT_ALL,        JP_PROP_NONE,    HasObject1),
  273.     CMP_TOKEN( FR_PART_NONE)
  274. };
  275.  
  276. //
  277. // -- CombineParentPreposition2 --
  278. // 名詞 + 前置詞句 → 名詞句
  279. // 前置詞の辞書をたよりに連結する
  280. //    (熟語を除く)
  281. //
  282. void
  283. CombineParentPreposition2(TOKEN *start)
  284. {
  285.     TOKEN    *p;
  286.     TOKEN    *lastParent = NULL, *lastPreposition = NULL;
  287.  
  288.     // 文末の前置詞は無視する
  289.     for(p = start; p; p = p->next) {
  290.  
  291.         if(IsPatternMatch(pat_VerbRecursivePreposition, p)
  292.         && MatchVerbObject(p, p->next, p->next->next) == NULL) {
  293.             lastParent = p;
  294.             p = lastPreposition = SkipTokens(p, 2);
  295.         } else if(!(p->frPart & FR_PART_COMBINE)
  296.         // 動詞訳に前置詞が含まれているかもしれない
  297.         // 前置詞側からアプローチはしない
  298.         && !IsObjectMatch(p, FR_PART_VERB_UNCLEAR)
  299.         // 間に関係代名詞は入れない
  300.         && SearchToken(FR_PART_RELATIVE_ALL, p->child) == NULL
  301.         && HasVerbVerbObject(p) == FALSE
  302.         // j'l ai pour -> je ai <le + pour> とならないように
  303.         && p->moved == 0
  304.         && p->next
  305.         && (p->next->frPart & FR_PART_PREPOSIT)
  306.         &&  p->next->frPartChoice != FR_PART_OBJECT
  307.         &&  p->next->object1
  308.         && (p->frPart & p->next->frPartParent)
  309.         && MatchParentPreposition(p, p->next)) {
  310.             if(SearchToken(FR_PART_PREPOSIT_ALL, FR_PUNCT_COMMA, p->child)
  311.             && p->punctuation != FR_PUNCT_COMMA)
  312.                     break;
  313.  
  314.             lastParent = p; lastPreposition = p->next;
  315.         }
  316.     }
  317.  
  318.     if(lastParent
  319.     && lastPreposition) {
  320.         CombineParentPreposition(start, lastParent, lastPreposition);
  321.     }
  322. }
  323.  
  324.  
  325. void
  326. CombineParentPreposition(TOKEN *start, TOKEN *parent, TOKEN *prep)
  327. {
  328.     if(!(prep->frPartParent & parent->frPart)
  329.     || prep->frPartChoice == FR_PART_OBJECT)
  330.         return;
  331.  
  332.     if(prep->frPartChoice & FR_PART_OBJECT)
  333.         ConsiderVerbObjectPreposition(start, parent, prep);
  334.  
  335.     TOKEN *q;        // 別の親になる可能性のあるToken
  336.     FR_PART    frPart = (FR_PART)(prep->frPartParent & ~parent->frPart);
  337.     frPart = (FR_PART)(frPart & FR_PART_ALL);
  338.     frPart = (FR_PART)(frPart & ~FR_PART_ADVERB_ADJECTIVE);
  339.     
  340.     for(q = start; q && q != parent && frPart; ) {
  341.         q = SearchPrepositionParent(q, parent, frPart);
  342.         if(q
  343.         && (q->frPart & frPart)
  344.         &&  MatchParentPreposition(q, prep)) {
  345. //            PrintInternalError( "ParentPreposition 2 : %s (%08x)\n", GetTokenFrench(prep), frPart);
  346.             TOKEN *altParent = CopyCurrentTree(q, "ParentPreposition 2");
  347.             TOKEN *altPrep = SkipTokens(altParent, TokenLength(q, prep));
  348.             altPrep->frPartParent = (FR_PART)(q->frPart & frPart);
  349.             altPrep->frPartChoice = FR_PART_PREPOSIT;
  350.             frPart = (FR_PART)(frPart & ~q->frPart);
  351.             CancelMiddlePreposition(altParent, altPrep);
  352. //            break;
  353.         }
  354.         if(q)    q = q->next;
  355.     }
  356.     AttatchParentPreposition(start, parent, prep);
  357. }
  358.  
  359. void
  360. ConsiderVerbObjectPreposition(TOKEN *start, TOKEN *parent, TOKEN *prep)
  361. {
  362.     TOKEN    *verb;
  363.  
  364.     for(verb = start; verb; verb = verb->next) {
  365.         // Prepositionを目的語としてとりそうな動詞を探す
  366.         verb = SearchToken(FR_PART_VERB_UNCLEAR, verb, parent);
  367.         if(verb == NULL) break;
  368.         if(HasPrepositionObject(verb, prep)) {
  369.             TOKEN *altP = CopyCurrentTree(prep, "ParentPreposition 3");
  370.             altP->frPartParent = FR_PART_NONE;
  371.             altP->frPartChoice = FR_PART_OBJECT;        // 動詞の目的語専用
  372.             prep->frPartChoice = (FR_PART)(prep->frPartChoice & ~FR_PART_OBJECT);
  373.             return;
  374.         }
  375.     }
  376. }
  377.  
  378. TOKEN
  379. *SearchPrepositionParent(TOKEN *start, TOKEN *end, FR_PART frPart)
  380. {
  381.     TOKEN    *p;
  382.  
  383.     for(p = start; p && p != end; p = p->next) {
  384.         if(p->frPart & frPart)    return p;
  385.         // 間に関係代名詞は入らない
  386.         if(p->frPart & FR_PART_RELATIVE)    break;
  387.     }
  388.     return(NULL);
  389. }
  390.  
  391. //
  392. // ParentとPrepsitionの間にある、Prepositionは、Parentに付けない
  393. //
  394. void
  395. CancelMiddlePreposition(TOKEN *parent, TOKEN *prep)
  396. {
  397.     TOKEN    *p;
  398.  
  399.     for(p = parent; p; p = p->next) {
  400.         p = SearchToken(prep->frPart, p, prep);
  401.         if(p == NULL)    break;
  402.         // Verb + Prep1 + Prep2で、
  403.         // Verb + Prep2を連結したら、 Verb + Prep1は連結させない
  404.         p->frPartParent = (FR_PART)(p->frPartParent & ~parent->frPart);
  405.     }
  406. }
  407.  
  408.  
  409. void
  410. AttatchParentPreposition(TOKEN *start, TOKEN *parent, TOKEN *prep)
  411. {
  412.     TOKEN    *q;
  413.  
  414.     for(q = start; q; q = q->next) {
  415.         if(q == prep)    break;
  416.     }
  417.     if(q) DisconnectTOKEN(start, prep);
  418.  
  419.     if(SearchToken(prep->frPart, parent->child))
  420.         prep->scoreCombine += SCORE_SAME_CHILD;
  421.  
  422.     prep->frPartParent = parent->frPart;
  423.     AddChildTOKEN(parent, prep);
  424.  
  425.     if(prep->frPart != FR_PART_PREPOSIT_DE) {
  426.         if(parent->frPart & FR_PART_VERB)
  427.             prep->scoreCombine += SCORE_VERB_PREPOSITION;
  428.     }
  429.  
  430.     SelectJpPreposition2(parent, prep);
  431.  
  432.     if((parent->frPart & FR_PART_VERB)
  433.     && parent->which
  434.     && parent->object1 == NULL
  435.     && parent->object2 == NULL
  436.     && !IsAlwaysIntransitiveVerb(parent)) {
  437.         // 前置詞を処理したら、別の展開があるかもしれない
  438.         // eg) Il ne reste (@ cet {gard)(pour Marie) que des souvenirs tr}s amers.
  439.         prep->scoreCombine += SCORE_INSERTED_PREPOSITION;
  440.         parent->which = NULL;
  441.         // 本当は、object1, object2も返すべき?
  442.         // if(parent->object1)    {
  443.         //    InseartToken(parent, object1);
  444.         //    parent->object1 = NULL;
  445.         // } なんてね。
  446.     }
  447.     if((parent->frPart & FR_PART_NOUN)
  448.     && parent->punctuation == FR_PUNCT_COMMA
  449.     && SearchToken(FR_PART_RELATIVE_ALL, parent->child) == NULL
  450.     && SearchToken(FR_PART_PREPOSIT_ALL, parent->child, prep) == NULL) {
  451.         // 途中に挿入文があった場合、弱いよな
  452.         // eg) J'ai cri{ vers vous, Seigneur, <du> fond. 奥のあなた -> 奥からあなたを叫びました。
  453.         prep->scoreCombine = SCORE_SPILIT_PREPOSITION;
  454.     }
  455.     // 文章に連結する場合
  456.     if(parent->subject) {
  457.         prep->jpEmphasis |= JP_EMPHASIS_COMMA;
  458.     }
  459. }
  460.  
  461. JP_PREPOSITION
  462. *MatchPrepositionObject(TOKEN *p, TOKEN *object)
  463. {
  464.     if((p->frPart & FR_PART_COMBINE)
  465.     || IsObjectMatch(object, FR_PART_VERB_UNCLEAR))
  466.         return(NULL);
  467.  
  468.     JP_PREPOSITION *jpPreposition = ((PREPOSITION *)p->what)->jpPreposition;
  469.     int                proposed      = ((PREPOSITION *)p->what)->proposed;
  470.  
  471.     while(proposed-- > 0) {
  472.         if(IsObjectMatch(object, jpPreposition->object)) {
  473.             return(jpPreposition);
  474.         }
  475.         jpPreposition++;
  476.     }
  477.     return(NULL);
  478. }
  479.  
  480. BOOL
  481. SelectJpPreposition1(TOKEN *p, TOKEN *object)
  482. {
  483.     if(p->frPart & FR_PART_COMBINE)    return(FALSE);
  484.  
  485.     JP_PREPOSITION *jpPreposition = MatchPrepositionObject(p, object);
  486.  
  487.     if(jpPreposition) {
  488.         p->jpProp = jpPreposition->myJpProp;
  489.         if(p->jpProp == JP_PROP_NONE)
  490.             p->jpProp = object->jpProp;
  491.         p->which = jpPreposition;
  492.         return(TRUE);
  493.     } else 
  494.         return(FALSE);
  495. }
  496.  
  497. JP_PREPOSITION
  498. *MatchParentPreposition(TOKEN *parent, TOKEN *prep)
  499. {
  500.  
  501.     if(parent == NULL
  502.     || prep    == NULL
  503.     || prep->object1 == NULL
  504.     || prep->frPartChoice == FR_PART_OBJECT        // 動詞の目的語用に持っておいたもの
  505.     || parent->frPart == FR_PART_NOUN_SUBJECT)    // je, tu, ilに前置詞は付かない
  506.         return NULL;
  507.  
  508.     if(prep->frPart & FR_PART_COMBINE) {
  509.         if(prep->object1 == NULL
  510.         || prep->object2 == NULL)
  511.             return(NULL);
  512.  
  513.         JP_PREPOSITION    *ret1 = MatchParentPreposition(parent, prep->object1);
  514.         JP_PREPOSITION    *ret2 = MatchParentPreposition(parent, prep->object2);
  515.         if(ret1 && ret2)
  516.             return(ret2);    // てきとー
  517.         return(NULL);
  518.     }
  519.  
  520.     // 補語人称代名詞は、前置詞を伴わない
  521.     if((parent->frPart & FR_PART_NOUN) && parent->moved)
  522.         return NULL;
  523.  
  524.     TOKEN    *object = prep->object1;
  525.  
  526.     JP_PREPOSITION    *jpPreposition = ((PREPOSITION *)prep->what)->jpPreposition;
  527.     int                proposed       = ((PREPOSITION *)prep->what)->proposed;
  528.  
  529.     while(proposed-- > 0) {
  530.         if(IsObjectMatch(object, jpPreposition->object)
  531.         && IsObjectMatch(parent, jpPreposition->parent)) {
  532.                 return(jpPreposition);
  533.         }
  534.         jpPreposition++;
  535.     }
  536.     return(NULL);
  537. }
  538.  
  539.  
  540. BOOL
  541. SelectJpPreposition2(TOKEN *parent, TOKEN *p)
  542. {
  543.     if(p == NULL)    return(FALSE);
  544.  
  545.     if(p->frPart & FR_PART_COMBINE) {
  546.         BOOL    ret1 = SelectJpPreposition2(parent, p->object1);
  547.         BOOL    ret2 = SelectJpPreposition2(parent, p->object1);
  548.         if(ret1 && ret2)    return(TRUE);
  549.         return(FALSE);
  550.     }
  551.  
  552.     JP_PREPOSITION    *jpPreposition = MatchParentPreposition(parent, p);
  553.  
  554.     if(jpPreposition) {
  555.         p->jpProp = jpPreposition->myJpProp;
  556.         if(p->jpProp == JP_PROP_NONE)    // 前置詞にpropがなければ目的語のpropを持ってくる
  557.             p->jpProp = p->object1->jpProp;
  558.         p->which = jpPreposition;
  559.         if(p->object1->frPart & FR_PART_NOUN)
  560.             SelectJpNoun(p, p->object1, p, jpPreposition->object.jpProp, JP_PROP_ALL);
  561.         if(jpPreposition->Exec)
  562.             jpPreposition->Exec(parent, p);
  563.         return(TRUE);
  564.     }
  565.     return(FALSE);
  566. }
  567.  
  568.